HEX
Server: Apache/2.4.68 (Debian)
System: Linux as-cs-widget-demo-us-central1 6.1.0-44-cloud-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.164-1 (2026-03-09) x86_64
User: root (0)
PHP: 8.2.32
Disabled: NONE
Upload Files
File: /var/www/kevin-demo/wp-content/plugins/grocerslist/includes/Plugin.php
<?php

namespace GrocersList;

use GrocersList\Admin\AjaxController;
use GrocersList\Admin\CategoryGating;
use GrocersList\Admin\PageGating;
use GrocersList\Admin\PostGating;
use GrocersList\Admin\SalesPage;
use GrocersList\Admin\SettingsPage;
use GrocersList\Frontend\ClientScripts;
use GrocersList\Frontend\EmailVerificationPage;
use GrocersList\Frontend\PublicAjaxController;
use GrocersList\Frontend\WprmPrintIntegration;
use GrocersList\Service\CreatorSettingsFetcher;
use GrocersList\Service\MemberService;
use GrocersList\Service\LinkRewriter;
use GrocersList\Service\WpUserCleanupService;
use GrocersList\Support\ContentFilter;
use GrocersList\Support\ElevatedUserRemediation;
use GrocersList\Support\Logger;
use GrocersList\Support\SalesPagePattern;

class Plugin
{
    private static bool $registered = false;

    public function register(): void
    {
        if (defined('WP_DEBUG') && WP_DEBUG) {
            Logger::enable();
        } else {
            Logger::disable();
        }

        if (self::$registered) {
            Logger::debug('GrocersList\\Plugin::register() skipped, already registered.');
            return;
        }

        // Run installer to check for database updates
        require_once __DIR__ . '/Database/Installer.php';
        Database\Installer::install();

        // Register the hook for async migration
        add_action('migration_visitor_run_async', ['\GrocersList\Jobs\MigrationVisitor', 'start']);

        $creatorSettingsFetcher = new CreatorSettingsFetcher();
        $memberService = new MemberService();

        $linkRewriter = new LinkRewriter();
        $linkRewriter->register();

        $salesPagePattern = new SalesPagePattern($creatorSettingsFetcher);
        $salesPage = new SalesPage($salesPagePattern);
        $salesPage->register();

        $ajaxController = new AjaxController($creatorSettingsFetcher, $salesPage);
        $ajaxController->register();

        $publicAjaxController = new PublicAjaxController();
        $publicAjaxController->register($creatorSettingsFetcher, $memberService);

        $emailVerificationPage = new EmailVerificationPage();
        $emailVerificationPage->register();

        // Hourly WP-Cron handler: poll GL server for churned followers and delete
        // (or dissociate) their WordPress users locally.
        $wpUserCleanupService = new WpUserCleanupService($creatorSettingsFetcher);
        add_action('grocerslist_wp_user_cleanup', [$wpUserCleanupService, 'run']);

        // Self-heal the cron schedule on every request. register_activation_hook
        // fires only on click-to-activate; auto-updates from earlier plugin
        // versions do NOT re-fire it, so existing installs that upgrade to this
        // version would otherwise never get the cleanup cron scheduled. Cheap
        // after the first schedule (wp_next_scheduled short-circuits).
        add_action('init', function () {
            if (!wp_next_scheduled('grocerslist_wp_user_cleanup')) {
                wp_schedule_event(time(), 'hourly', 'grocerslist_wp_user_cleanup');
            }
        });

        // UIs:
        $settingsPage = new SettingsPage($creatorSettingsFetcher);
        $settingsPage->register();

        $clientScripts = new ClientScripts($creatorSettingsFetcher, $memberService);
        $clientScripts->register();

        $wprmPrintIntegration = new WprmPrintIntegration($creatorSettingsFetcher, $clientScripts);
        $wprmPrintIntegration->register();

        $contentFilter = new ContentFilter($creatorSettingsFetcher);
        $contentFilter->register();

        // Register post, page, and category gating components
        $postGating = new PostGating();
        $postGating->register();

        $pageGating = new PageGating();
        $pageGating->register();

        $categoryGating = new CategoryGating();
        $categoryGating->register();

        $elevatedUserRemediation = new ElevatedUserRemediation();
        $elevatedUserRemediation->register();

        self::$registered = true;
    }
}